/*
 * 1. str是literal类型，不支持修改，只读的ubyte序列；
 * 2. String可以修改，底层序列是变的。
 * 3. 支持切片，切片语法与Golang/Python不同，是start..end的格式。
 */
fn main() {
    println!("Hello, world!");
    // create
    // 字符串String类是preclude的，就是内置的意思，不用额外use std。
    let mut s = String::new();
    println!("empty string: [{}]", s);

    let s1 = "initial contents".to_string();

    println!("string: {}", s1);

    let mut hello = String::from("你好");
    println!("Hello in chineses: {}", hello);
    hello.push_str("，世界");
    println!("Hello in chineses: {}", hello);


    println!("length: {}", hello.len());
    // 不支持索引
    // let c0 = hello[0];
    //

    let hello0 = "你好，世界";
    // 直接下标索引，也不支持，提示下标只能是数字切片。
    // let i0 = hello0[0];

    // 因为汉字是utf8，3个字节表示一个汉字，所以切片时必须是3的整数倍。
    let answer = &hello0[0..3];
    println!("length in utf8: {}", answer.len());

    // 也不允许，因为把‘你’拆开了。
    // let answer2 = &hello0[1..4];

    // 遍历
    for c in hello0.chars() {
        println!("Char: {}", c);
    }

    // 使用bytes遍历所有byte，输出是15个整数
    for b in hello0.bytes() {
        println!("byte: {}", b);
    }

    // 遍历String
    for c in hello.chars() {
        println!("Char: {}", c);
    }

    // 替换字符串
}
